import os
import sys
from datetime import datetime
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget, QHBoxLayout, \
    QCheckBox, QLineEdit, QButtonGroup, QRadioButton, QShortcut, QToolTip
from PyQt5.QtCore import QTimer, Qt, QSize, QPoint
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtGui import QMovie, QIcon, QKeySequence
from PyQt5.QtCore import QUrl


# 实现倒计时功能
class CountdownTimer(QMainWindow):

    #####################################################################
    WINDOW_SIZE = [320, 180]
    COUNTDOWN_TIME = 5  # 初始化时间为2分钟
    COUNT_DOWN_ANIMATION_TIME = 9  # 倒计时动画展示的时长，倒计时10s时展示动画
    FULL_SIZE_RATE = 0.32  # 全屏时填充的占比大小
    DEFAULT_FONT_SIZE = 60  # 初始时字体的默认大小
    FULL_FONT_SIZE = 300  # 全屏时字体的大小
    ANIMATION_SHOW_SIZE = [320, 180]  # GIF动画的播放大小
    STEP_VALUE = 1  # 默认的 步 进长度
    BRIGHT_MODE = "#FCE4EC"  # #A5D6A7 #A9DFBF 亮色主题背景颜色 #f5f5f5 #D5F5E3
    DARK_MODE = "#000000"    # 暗色主题背景颜色#333333 #AEB6BF
    # 提示音文件地址
    TIP_BGM_URL = 'res/bgm/dididi.mp3'
    ICO_START_URL ='res/ico/start.png'
    ICO_PAUSE_URL = 'res/ico/pause.png'
    ICO_FULL_URL = 'res/ico/full.png'
    #####################################################################

    def __init__(self):
        super().__init__()
        self.is_fullscreen = False
        self.init_date_time_timer()
        self.theme = self.BRIGHT_MODE  # 默认使用亮色主题
        self.initUI()
        # 设置初始主题颜色
        self.setTheme(self.BRIGHT_MODE)
        # 保存窗口的正常几何尺寸
        self.normalGeometry = self.geometry()
        self.initTimer()
        self.initSound()

    def initUI(self):
        self.setWindowTitle('倒计时@佛系小吴-24617R1')
        # 第一个参数 (100): 窗口左上角距离屏幕左边缘的水平像素距离。
        # 第二个参数 (100): 窗口左上角距离屏幕顶部边缘的垂直像素距离。
        # 第三个参数 (320): 窗口的宽度，即窗口左右边缘之间的像素距离。
        # 第四个参数 (180): 窗口的高度，即窗口上下边缘之间的像素距离。
        self.setGeometry(250, 250, self.WINDOW_SIZE[0], self.WINDOW_SIZE[1])
        self.setWindowIcon(QIcon(self.get_resource_path('res/app.ico')))
        # 设置窗口背景颜色
        self.setStyleSheet("background-color: #f5f5f5;")  # 例如，这里设置为浅灰色

        centralWidget = QWidget()
        layout = QVBoxLayout(centralWidget)
        # 创建时间输入框和加减按钮的水平布局
        timeLayout = QHBoxLayout()

        # 设置倒计时标签样式
        self.countdownLabel = QLabel('00:00:00', self)
        # 优化倒计时标签的样式，设置字体大小、颜色和加粗
        self.countdownLabel.setStyleSheet("""
            QLabel {
                font-size: %dpx;
                font-weight: bold; /* 加粗 */
                color: #FF4500; /*  #EC407A 红橙色 #FF4500 深粉红色 #FF1493 间宝石绿 #66CDAA */
                font-family: 'Consolas'; /* "Arial"、"Helvetica"、"Times" 、"Consolas" */
                text-shadow: 2px 2px 4px #000000; /* 添加字体阴影 */
            }
        """ % self.DEFAULT_FONT_SIZE)
        self.countdownLabel.setAlignment(Qt.AlignCenter)  # 水平和垂直居中对齐
        layout.addWidget(self.countdownLabel)
        self.countdownLabel.setObjectName("countdownLabel")  # 设置对象名称

        # 创建水平布局并添加按钮
        buttonLayout = QHBoxLayout()

        # 设置输入框样式
        # 初始化时间并设置输入框显示时间
        self.timeInput = QLineEdit(f'{self.COUNTDOWN_TIME}', self)
        self.timeInput.setPlaceholderText('输入分钟数')
        self.timeInput.setStyleSheet("""
                          QLineEdit {
                              background-color: #FFFFFF;
                              border-radius: 20px;
                              padding: 5px;
                              border: 2px solid #2196F3;
                          }
                          QLineEdit:focus {
                              border: 2px solid #1976d2;
                          }
                      """)
        layout.addWidget(self.timeInput, alignment=Qt.AlignCenter)

        # 在initUI方法中添加显示日期和时间的标签
        self.label_datetime = QLabel('', self)  # 初始化日期时间标签
        self.label_datetime.setAlignment(Qt.AlignCenter)
        self.label_datetime.setStyleSheet("""
            font-size: 24px;
            color: #F0FFF0;  /* 设置字体颜色 #34a853 绿色  #F0FFF0 灰暗*/
            background-color: #EC407A;  /* 设置背景颜色  #82E0AA  灰色/灰色 ＃808080 甘露 #F0FFF0  HotPink2 #EE6AA7 */
            border-radius: 10px;  /* 设置边框圆角 */
            padding: 10px;  /* 设置内边距 */
            font-family: 'Consolas';
        """)
        layout.addWidget(self.label_datetime)  # 将时间标签添加到布局中

        self.timeInput.textChanged.connect(self.update_time)  # 绑定文本变化事件

        # 创建加号按钮并连接事件
        self.addButton = QPushButton('+', self)
        self.addButton.setIcon(QIcon.fromTheme('list-add'))  # 使用内置图标
        self.addButton.setShortcut(QKeySequence("Ctrl+Plus"))  # 设置快捷键
        self.addButton.setStyleSheet("""
                    QPushButton {
                        border: 1px solid #FFFF00;
                        background-color: #4CAF50;
                        color: #FFFFFF;
                        border-radius: 30px;  /* 设置圆角 */
                        padding: 10px;  /* 增加内边距，使按钮更大 */
                        font-size: 18px;  /* 设置字体大小 */
                    }
                    QPushButton:hover {
                        background-color: #45a049;
                    }
                    QPushButton:pressed {
                        background-color: #397d35;
                    }
                """)
        self.addButton.clicked.connect(lambda: self.changeTime(self.STEP_VALUE))
        # 创建减号按钮并连接事件
        self.reduceButton = QPushButton('-', self)
        self.reduceButton.setIcon(QIcon.fromTheme('list-remove'))  # 使用内置图标
        self.reduceButton.setShortcut(QKeySequence("Ctrl+Minus"))  # 设置快捷键
        self.reduceButton.setStyleSheet("""
                    QPushButton {
                         border: 1px solid #FFFF00; /* 按钮的外边框 */
                         background-color: #f44336;
                         color: #FFFFFF;
                         border-radius: 30px;  /* 设置圆角 */
                         padding: 10px;  /* 增加内边距，使按钮更大 */
                         font-size: 18px;  /* 设置字体大小 */
                    }
                    QPushButton:hover {
                        background-color: #e53935;
                    }
                    QPushButton:pressed {
                        background-color: #c62828;
                    }
                """)
        self.reduceButton.clicked.connect(lambda: self.changeTime(-self.STEP_VALUE))

        # 将按钮和输入框添加到水平布局
        timeLayout.addWidget(self.reduceButton)
        timeLayout.addWidget(self.timeInput)
        timeLayout.addWidget(self.addButton)

        self.step_values = [1, 5, 10]
        self.stepGroup = QButtonGroup()
        self.stepGroup.setExclusive(True)  # 确保按钮组内只能选择一个按钮
        # 创建单选按钮并添加到按钮组和布局
        self.step_buttons = []  # 存储所有单选按钮的列表
        for index, step in enumerate(self.step_values):
            button = QRadioButton(f'{step}', self)
            button.setAutoExclusive(True)
            # 设置单选按钮的样式
            button.setStyleSheet("""
                QRadioButton {
                    background-color: #FF8C00; /* 背景色  	#F8C471 深橙色 #FF8C00 */
                    color: #CC00CC; /* 文本色#333 #3498DB #CC00CC  */
                    font-size: 15px; /* 字体大小 */
                    border: 1px solid #bbb; /* 边框 */
                    border-radius: 10px; /* 圆角 */
                    padding: 5px; /* 内边距 */
                }
                QRadioButton::indicator {
                    width: 15px; /* 指示器宽度 */
                    height: 15px; /* 指示器高度 */
                }
            """)
            timeLayout.addWidget(button)  # 添加按钮到布局
            self.step_buttons.append(button)  # 将按钮添加到列表
            self.stepGroup.addButton(button, id=step)  # 将按钮添加到按钮组，并设置按钮的ID
        # 默认选中第一个按钮
        self.step_buttons[0].setChecked(True)
        # 连接按钮组的 selected 信号到槽函数
        self.stepGroup.buttonClicked[int].connect(self.onStepButtonClicked)

        # 添加主题切换单选按钮
        self.themeButton = QRadioButton('暗', self)
        self.themeButton.setChecked(False)  # 默认不选中
        # 设置单选按钮的样式
        self.themeButton.setStyleSheet("""
            QRadioButton {
                background-color: #7D3C98; /* 背景色  #4DD0E1	#F8C471 深橙色 #FF8C00 */
                color: #3498DB; /* 文本色 #3498DB #CC00CC  */
                font-size: 15px; /* 字体大小 */
                border: 1px solid #bbb; /* 边框 */
                border-radius: 10px; /* 圆角 */
                padding: 5px; /* 内边距 */
            }
        """)
        self.themeButton.toggled.connect(self.toggleTheme)  # 连接toggled信号到槽函数
        # 将主题切换按钮添加到布局中
        timeLayout.addWidget(self.themeButton)

        # 将时间布局添加到主布局
        layout.addLayout(timeLayout)

        # 设置开始按钮样式并添加图标
        self.startButton = QPushButton('开始', self)
        self.startButton.setIcon(QIcon(self.get_resource_path(self.ICO_START_URL)))  # 替换为您的图标文件路径
        self.startButton.setStyleSheet("""
                    QPushButton {
                        background-color: #4CAF50;
                        border-radius: 20px;
                        padding: 10px;
                    }
                    QPushButton:hover {
                        background-color: #45a049;
                    }
                    QPushButton:pressed {
                        background-color: #397d35;
                    }
                """)
        self.startButton.clicked.connect(self.startTimer)

        # 设置暂停按钮样式并添加图标
        self.pauseButton = QPushButton('暂停', self)
        self.pauseButton.setIcon(QIcon(self.get_resource_path(self.ICO_PAUSE_URL)))  # 替换为您的图标文件路径
        self.pauseButton.setStyleSheet("""
                    QPushButton {
                        background-color: #f44336;
                        border-radius: 20px;
                        padding: 10px;
                    }
                    QPushButton:hover {
                        background-color: #e53935;
                    }
                    QPushButton:pressed {
                        background-color: #c62828;
                    }
                """)
        self.pauseButton.clicked.connect(self.pauseTimer)

        # 设置全屏按钮样式并添加图标
        self.fullscreenButton = QPushButton('全屏', self)
        self.fullscreenButton.setIcon(QIcon(self.get_resource_path(self.ICO_FULL_URL)))  # 替换为您的图标文件路径
        self.fullscreenButton.setStyleSheet("""
                   QPushButton {
                       background-color: #2196F3;
                       border-radius: 20px;
                       padding: 10px;
                   }
                   QPushButton:hover {
                       background-color: #1e88e5;
                   }
                   QPushButton:pressed {
                       background-color: #1976d2;
                   }
               """)
        # 点击按钮实现全屏
        self.fullscreenButton.clicked.connect(self.toggleFullScreen)
        ######## 连接鼠标进入和离开事件 #####
        self.fullscreenButton.enterEvent = self.showToolTip
        self.fullscreenButton.leaveEvent = self.hideToolTip
        # 初始化退出全屏的快捷键 ESC 实现全屏与退出
        self.esc_shortcut = QShortcut(QKeySequence(Qt.Key_Escape), self)
        self.esc_shortcut.activated.connect(self.toggleFullScreen)

        # 添加按钮到布局
        buttonLayout.addWidget(self.startButton)
        buttonLayout.addWidget(self.pauseButton)
        buttonLayout.addWidget(self.fullscreenButton)
        layout.addLayout(buttonLayout)

        self.soundCheckBox = QCheckBox('[倒计时结束播放声音~ 滴滴滴]', self)
        self.soundCheckBox.setChecked(True)
        layout.addWidget(self.soundCheckBox)

        # 添加动画显示的标签，并设置居中
        self.movieLabel = QLabel(self)
        #self.movieLabel.resize(200, 200)  # 设置固定的宽度和高度
        self.movieLabel.setAlignment(Qt.AlignCenter)  # 水平和垂直居中对齐
        layout.addWidget(self.movieLabel)

        # 在movieLabel上方和下方添加伸展空间
        layout.addStretch(1)
        layout.addWidget(self.movieLabel)
        layout.addStretch(1)
        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    # 优化打包单文件exe加载不到的问题
    def get_resource_path(self, relative_path):
        try:
            base_path = sys._MEIPASS
        except AttributeError:
            base_path = os.path.abspath(".")
        dest_path = os.path.join(base_path, relative_path)
        return dest_path

    def get_current_datetime(self):
        now = datetime.now()
        return now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化日期和时间

    def init_date_time_timer(self):
        self.dateTimeTimer = QTimer(self)
        self.dateTimeTimer.timeout.connect(self.update_date_time)
        self.dateTimeTimer.start(1000)  # 每1000毫秒（1秒）更新一次

    def update_date_time(self):
        current_datetime = self.get_current_datetime()
        self.label_datetime.setText(current_datetime)

    # 这个是更新倒计时的时间函数值
    def update_time(self, text):
        try:
            new_time = int(text)
            self.COUNTDOWN_TIME = max(1, new_time)  # 确保时间不小于1分钟
            self.timeInput.setText(f'{self.COUNTDOWN_TIME}')
        except ValueError:
            pass  # 如果输入无效，保持当前时间不变

    # 单选选择后 传值进去为全局变量
    def onStepButtonClicked(self, id):
        self.STEP_VALUE = id  # 按钮的ID即为步进值

    # 根据 步 进的长度来设置每次加价数据量
    def changeTime(self, delta):
        self.COUNTDOWN_TIME += delta
        self.COUNTDOWN_TIME = max(1, self.COUNTDOWN_TIME)  # 确保时间不小于1分钟
        self.timeInput.setText(f'{self.COUNTDOWN_TIME}')

    def increaseTime(self):
        if self.COUNTDOWN_TIME < 60:  # 时间小于60分钟时才允许增加
            self.COUNTDOWN_TIME += 1
            self.timeInput.setText(f'{self.COUNTDOWN_TIME}')

    def reduceTime(self):
        if self.COUNTDOWN_TIME > 1:  # 时间大于1分钟时才允许减少
            self.COUNTDOWN_TIME -= 1
            self.timeInput.setText(f'{self.COUNTDOWN_TIME}')

    def initTimer(self):
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateCountdown)
        self.remainingTime = 0

    def initSound(self):
        self.mediaPlayer = QMediaPlayer(self)
        self.mediaPlayer.setVolume(100)
        self.soundFile = self.get_resource_path(self.TIP_BGM_URL)  # 替换为你的声音文件路径
        self.mediaContent = QMediaContent(QUrl.fromLocalFile(self.soundFile))
        self.mediaPlayer.setMedia(self.mediaContent)
        # 连接 finished 信号到停止动画的槽函数 播放结束
        self.mediaPlayer.mediaStatusChanged.connect(self.onMediaStatusChanged)

    def onMediaStatusChanged(self, status):
        # 检查媒体播放是否结束 EndOfMedia = 7
        if status == QMediaPlayer.EndOfMedia:
            self.stopAnimation()

    def startTimer(self):
        try:
            print('---> 点击了开始 %s' % self.normalGeometry)
            # 将输入的分钟数转换为秒数
            minutes = int(self.timeInput.text())
            self.remainingTime = minutes * 60

            # 隐藏 movieLabel 上的动画显示
            if self.movieLabel.isVisible():  # 检查 movieLabel 是否可见
                self.movieLabel.setVisible(False)

            # 如果 movieLabel 正在播放动画，则停止并移除
            if self.movieLabel.movie():
                self.movieLabel.movie().stop()
                self.movieLabel.setMovie(None)

            # 优化倒计时标签的样式，设置字体大小、颜色和加粗
            if self.is_fullscreen:
                self.adjustFontSize(self.FULL_FONT_SIZE)
            else:
                self.adjustFontSize(self.DEFAULT_FONT_SIZE)
            # 启动倒计时
            self.timer.start(1000)
            self.startButton.setEnabled(False)
            self.pauseButton.setEnabled(True)
        except ValueError:
            print("请输入有效的分钟数")

    def pauseTimer(self):
        self.timer.stop()
        self.startButton.setEnabled(True)
        self.pauseButton.setEnabled(False)

    def updateCountdown(self):
        mins, secs = divmod(self.remainingTime, 60)
        hours, mins = divmod(mins, 60)
        time_str = '{:02}:{:02}:{:02}'.format(hours, mins, secs)
        self.countdownLabel.setText(time_str)
        self.remainingTime -= 1
        # 时间到
        if self.remainingTime <= self.COUNT_DOWN_ANIMATION_TIME:
            self.timer.stop()
            self.countdownLabel.setText('!时间到~')
            # 显示倒计时
            self.startAnimation()
            self.startButton.setEnabled(True)
            self.pauseButton.setEnabled(False)
            # 检查是否勾选播放声音 有的话 就开始 滴滴滴
            if self.soundCheckBox.isChecked():
                self.mediaPlayer.play()

    def startAnimation(self):
        movieFile = self.get_resource_path('res/down/down.gif')
        self.movie = QMovie(movieFile)
        # 使用常量设置动画尺寸 动画的固定尺寸
        self.movie.setScaledSize(QSize(self.ANIMATION_SHOW_SIZE[0], self.ANIMATION_SHOW_SIZE[1]))
        self.movieLabel.setMovie(self.movie)
        self.movie.start()
        self.movieLabel.setVisible(True)  # 显示 movieLabel

    def stopAnimation(self):
        # 停止 GIF 动画
        if self.movieLabel.movie():
            self.movieLabel.movie().stop()
            self.movieLabel.setMovie(None)  # 可选，从 QLabel 中移除 movie 对象

    def showToolTip(self, event):
        # 显示包含快捷键信息的提示
        QToolTip.showText(event.globalPos() + QPoint(10, -10),
                          "快捷键:ESC:全与缩屏", self.fullscreenButton)
    def hideToolTip(self, event):
        # 隐藏提示
        QToolTip.hideText()
    def toggleFullScreen(self):
        if self.is_fullscreen:
            self.is_fullscreen = False
            self.fullscreenButton.setText('全屏')
            # 点击缩屏
            self.showNormal()
            # 恢复原始字体大小
            self.adjustFontSize(self.DEFAULT_FONT_SIZE)
            # 恢复原始窗口状态
            self.setGeometry(self.normalGeometry)
            print('--> 点击缩屏: %s ' % self.normalGeometry)
        else:
            # 进入全屏前，保存当前的窗口大小
            self.normalGeometry = self.geometry()
            # 点击全屏
            self.is_fullscreen = True
            self.fullscreenButton.setText('缩屏')
            self.normalGeometry = self.geometry()
            # 调整字体大小以适应全屏
            self.adjustFontSizeAccordingToScreen()
            self.showFullScreen()
            print('--> 点击全屏: %s ' % self.normalGeometry)

    # 调整adjustFontSize方法，使其能够接受原始字体大小作为参数
    def adjustFontSize(self, fontSize):
        self.countdownLabel.setStyleSheet(f"""
            QLabel {{
                font-size: {fontSize}px;
                font-weight: bold; /* 加粗 */
                color: #EC407A; /* 水红#EC407A 蓝色#3F51B5 #26A69A 红橙色 #FF4500 深粉红色 #FF1493 间宝石绿 #66CDAA 青色#009ad6 */
                font-family: 'Consolas'; /* "Arial"、"Helvetica"、"Times" 、"Consolas" */
                text-shadow: 2px 2px 4px #000000; /* 添加字体阴影 */
            }}
        """)

    # 根据屏幕尺寸调整字体大小，使其占屏幕高度的 80%
    def adjustFontSizeAccordingToScreen(self):
        screen_height = self.screen().size().height()
        font_size = int(screen_height * self.FULL_SIZE_RATE)
        self.FULL_FONT_SIZE = font_size
        print("全屏后的字体大小: %s px." % font_size)
        self.adjustFontSize(font_size)

    def toggleTheme(self, isToggled):
        if isToggled:
            # 如果单选按钮被选中，则切换到暗色主题
            self.setTheme(self.DARK_MODE)
        else:
            # 如果单选按钮被取消选中，则切换回亮色主题
            self.setTheme(self.BRIGHT_MODE)

    def setTheme(self, themeColor):
        self.theme = themeColor
        self.setStyleSheet(f"background-color: {self.theme};")

    def closeEvent(self, event):
        # 确保在关闭窗口前退出全屏并恢复原始状态
        if self.is_fullscreen:
            self.showNormal()
            self.adjustFontSize(self.DEFAULT_FONT_SIZE)
            self.resize(self.normalGeometry.size())
        super().closeEvent(event)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = CountdownTimer()
    ex.show()
    sys.exit(app.exec_())